স্প্রিং বুট (Spring Boot) অ্যাপ্লিকেশনগুলিতে এক্সসেপশন হ্যান্ডলিং একটি অত্যন্ত গুরুত্বপূর্ণ দিক, কারণ এটি অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে। এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে আমরা একটি পরিষ্কার এবং অর্থপূর্ণ ত্রুটি বার্তা প্রদান করতে পারি, যা ডেভেলপারদের জন্য ডিবাগিং এবং ব্যবহারকারীদের জন্য সমস্যা সমাধান সহজ করে তোলে।
স্প্রিং বুটে এক্সসেপশন হ্যান্ডলিং করার জন্য কিছু গুরুত্বপূর্ণ কৌশল রয়েছে, যেমন @ControllerAdvice, @ExceptionHandler, এবং কাস্টম এক্সসেপশন তৈরি করা। এখানে আমরা একটি উদাহরণের মাধ্যমে স্প্রিং বুট অ্যাপ্লিকেশন থেকে এক্সসেপশন হ্যান্ডলিং কিভাবে করা যায় তা দেখব।
১. সাধারণ এক্সসেপশন হ্যান্ডলিং
স্প্রিং বুট অ্যাপ্লিকেশনে এক্সসেপশন হ্যান্ডলিং করার জন্য আমরা সাধারণত @ExceptionHandler এবং @ControllerAdvice ব্যবহার করি। এখানে আমরা একটি উদাহরণ দেখব যেখানে একটি সাধারণ UserNotFoundException এক্সসেপশন তৈরি করা হবে এবং এটি কিভাবে হ্যান্ডেল করা যায় তা দেখানো হবে।
Step 1: কাস্টম এক্সসেপশন তৈরি করা
প্রথমে আমাদের একটি কাস্টম এক্সসেপশন তৈরি করতে হবে। এটি এমন একটি এক্সসেপশন হবে যা ব্যবহারকারী না পাওয়া গেলে থ্রো করা হবে।
package com.example.demo.exception;
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
এখানে UserNotFoundException একটি রানটাইম এক্সসেপশন, যা ব্যবহারকারী না পাওয়া গেলে ছোড়া হবে।
Step 2: কন্ট্রোলারে এক্সসেপশন থ্রো করা
এখন, কন্ট্রোলারে আমরা UserNotFoundException থ্রো করব যদি কোনো ব্যবহারকারী নির্দিষ্ট আইডি দিয়ে পাওয়া না যায়।
package com.example.demo.controller;
import com.example.demo.exception.UserNotFoundException;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserRepository userRepository;
// GET: Retrieve a user by ID
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));
}
}
এখানে, যদি userRepository.findById(id) কোনো ব্যবহারকারী না পায়, তবে UserNotFoundException থ্রো হবে।
Step 3: এক্সসেপশন হ্যান্ডলিং
এখন, এক্সসেপশন হ্যান্ডলিং করার জন্য, আমরা @ControllerAdvice ব্যবহার করব। এটি একটি গ্লোবাল এক্সসেপশন হ্যান্ডলার হিসেবে কাজ করবে, যা সমস্ত কন্ট্রোলারেই এক্সসেপশন হ্যান্ডলিং করবে।
package com.example.demo.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class GlobalExceptionHandler {
// Handle UserNotFoundException
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
// Handle other exceptions
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGenericException(Exception ex) {
return new ResponseEntity<>("Internal server error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
এখানে:
@ExceptionHandler(UserNotFoundException.class)ব্যবহার করে আমরাUserNotFoundExceptionএর জন্য এক্সসেপশন হ্যান্ডলিং করেছি এবং একটি404 Not Foundরেসপন্স পাঠিয়েছি।@ExceptionHandler(Exception.class)ব্যবহার করে আমরা অন্যান্য এক্সসেপশনগুলোর জন্য একটি সাধারণ হ্যান্ডলার তৈরি করেছি, যা500 Internal Server Errorরেসপন্স পাঠাবে।
২. @ResponseStatus ব্যবহার
স্প্রিং বুটে @ResponseStatus অ্যানোটেশন ব্যবহার করে আপনি এক্সসেপশন ঘটলে সরাসরি HTTP স্ট্যাটাস কোড সেট করতে পারেন। এটি বিশেষভাবে সুবিধাজনক যখন আপনি কাস্টম এক্সসেপশন তৈরি করতে চান এবং সেটির জন্য HTTP স্ট্যাটাস কোড নির্ধারণ করতে চান।
উদাহরণ:
package com.example.demo.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "User not found")
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
এখন, UserNotFoundException এক্সসেপশন থ্রো হলে এটি স্বয়ংক্রিয়ভাবে 404 Not Found স্ট্যাটাস কোড সহ রেসপন্স পাঠাবে।
৩. Validation এক্সসেপশন হ্যান্ডলিং
যখন আপনি ডেটা ভ্যালিডেশন (যেমন, @NotNull, @Size, ইত্যাদি) ব্যবহার করেন, তখন যদি কোনো ভ্যালিডেশন ব্যর্থ হয়, তখন সাধারণত MethodArgumentNotValidException এক্সসেপশন ঘটে। আপনি এই এক্সসেপশনটিও হ্যান্ডল করতে পারেন।
উদাহরণ:
package com.example.demo.controller;
import com.example.demo.model.User;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping
public User createUser(@RequestBody @Valid User user, BindingResult result) {
if (result.hasErrors()) {
throw new UserNotValidException("Invalid user data");
}
// Save user logic
return user;
}
}
এখন, UserNotValidException এক্সসেপশন হ্যান্ডলিং করতে হবে:
package com.example.demo.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotValidException.class)
public ResponseEntity<String> handleValidationException(UserNotValidException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
উপসংহার
স্প্রিং বুটের এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে আপনি অ্যাপ্লিকেশনটির ত্রুটি সঠিকভাবে পরিচালনা করতে পারেন এবং ব্যবহারকারীকে অর্থপূর্ণ ত্রুটি বার্তা প্রদান করতে পারেন। @ControllerAdvice এবং @ExceptionHandler এর মাধ্যমে আমরা গ্লোবাল এবং নির্দিষ্ট এক্সসেপশন হ্যান্ডলিং করতে পারি। এছাড়া, @ResponseStatus এবং ভ্যালিডেশন এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে কোড আরও কার্যকরী ও পরিষ্কার করা যায়।
Read more